package mrms.api.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import mrms.api.entity.MeetingEntity;
import mrms.api.entity.MessageEntity;
import mrms.api.entity.UsermessageEntity;
import mrms.api.repository.MeetingRepository;
import mrms.api.repository.MessageRepository;
import mrms.api.repository.UserMessageRepository;
import mrms.api.repository.UserRepository;
import mrms.api.web.utils.MessageSender;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author lenchu
 * @date 2019/03/01
 */
@Service
@AllArgsConstructor
public class MessageService {
    private final UserMessageRepository userMessageRepository;
    private final MessageRepository messageRepository;
    private final MeetingRepository meetingRepository;
    private final ObjectMapper mapper;
    private final UserRepository userRepository;

    public void newMessage(MessageEntity messageEntity, String ...users) {
        messageRepository.save(messageEntity);
        List<UsermessageEntity> list = new ArrayList<>(users.length);
        for (String user : users) {
            UsermessageEntity usermessageEntity = new UsermessageEntity();
            usermessageEntity.setBeenread(1);
            usermessageEntity.setMid(messageEntity.getId());
            usermessageEntity.setUid(user);
            list.add(usermessageEntity);
        }
        userMessageRepository.saveAll(list);
//        if (users.length==1){
//            MessageSender.send(userRepository.findById(users[0]).get().getTel(),messageEntity.getType());
//        }
    }

    public void newMessage(Integer type, Object content, String ...users) {
        MessageEntity messageEntity = new MessageEntity();
        messageEntity.setType(type);
        messageEntity.setCreatetime(System.currentTimeMillis());
        try {
            messageEntity.setContent(mapper.writeValueAsString(content));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        this.newMessage(messageEntity, users);
    }

    public void newMessage(Integer type, MeetingEntity meetingEntity, String ...users) {
        MessageEntity messageEntity = new MessageEntity();
        messageEntity.setType(type);
        messageEntity.setCreatetime(System.currentTimeMillis());
        meetingEntity.setSponsorDetail(userRepository.findById(meetingEntity.getSponsor()).get());
        try {
            messageEntity.setContent(mapper.writeValueAsString(meetingEntity));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        this.newMessage(messageEntity, users);
    }

    public void newMessage(Integer type, Integer mid, String ...users) {
        MeetingEntity meetingEntity = meetingRepository.findById(mid).get();
        this.newMessage(type, meetingEntity, users);
    }

    public List<MessageEntity> findAllMessages(String user, Integer isRead) {
        List<UsermessageEntity> usermessageEntities = userMessageRepository.findAllByUidAndAndBeenread(user, isRead);
        List<MessageEntity> messages = usermessageEntities.stream().map(usermessageEntity -> {
            MessageEntity messageEntity = messageRepository.findById(usermessageEntity.getMid()).get();
            messageEntity.setBeedread(usermessageEntity.getBeenread());
            return messageEntity;
        }).collect(Collectors.toList());
        return messages;
    }

    public void readMessage(Integer mid, String uid) {
        Optional<UsermessageEntity> optionalUsermessageEntity = userMessageRepository.findByMidAndUid(mid, uid);
        if (optionalUsermessageEntity.isPresent()) {
            UsermessageEntity usermessageEntity = optionalUsermessageEntity.get();
            usermessageEntity.setBeenread(0);
            userMessageRepository.save(usermessageEntity);
        }
    }
}
